package com.yoofn.kotlin.base

import android.app.Application
import android.os.Handler
import android.os.Looper
import android.util.Log
import android.widget.Toast
import com.wanjian.cockroach.Cockroach
import com.yanzhenjie.nohttp.Logger
import com.yanzhenjie.nohttp.NoHttp
import com.yoofn.kotlin.utils.Utils


/**
 *
 * Created by kalshen on 17/6/2.
 * @描述 &{TODO}
 */
class MyApplication : Application() {

    override fun onCreate() {
        super.onCreate()

        //永不crash
        initCockroach()
        //初始化noHttp网络框架
        initNoHttp()
        //柯基工具类初始化
        Utils.init(this)
    }

    /**
     * 初始化NoHttp
     */
    private fun initNoHttp() {

        if (GlobalConfig.IS_ENABLE_NO_HTTP_CATCH) {
            Logger.setDebug(true)// 开启NoHttp的调试模式, 配置后可看到请求过程、日志和错误信息。
            Logger.setTag(GlobalConfig.HTTP_CATCH_DETAIL_LOG_TAG)// 设置NoHttp打印Log的tag。
        }

        NoHttp.initialize(this, NoHttp.Config()
                // 设置全局连接超时时间，单位毫秒
                .setConnectTimeout(10 * 1000)
                // 设置全局服务器响应超时时间，单位毫秒
                .setReadTimeout(10 * 1000)
        )
    }

    /**
     * 初始化小强
     */
    private fun initCockroach() {
        Cockroach.install { thread, throwable ->
            // handlerException内部建议手动try{  你的异常处理逻辑  }catch(Throwable e){ } ，以防handlerException内部再次抛出异常，导致循环调用handlerException

            //开发时使用Cockroach可能不容易发现bug，所以建议开发阶段在handlerException中用Toast谈个提示框，
            //由于handlerException可能运行在非ui线程中，Toast又需要在主线程，所以new了一个new Handler(Looper.getMainLooper())，
            //所以千万不要在下面的run方法中执行耗时操作，因为run已经运行在了ui线程中。
            //new Handler(Looper.getMainLooper())只是为了能弹出个toast，并无其他用途
            Handler(Looper.getMainLooper()).post(Runnable {
                try {
                    //建议使用下面方式在控制台打印异常，这样就可以在Error级别看到红色log
                    Log.e("AndroidRuntime", "--->CockroachException:$thread<---", throwable)
                    Toast.makeText(this@MyApplication, "Exception Happend\n" + thread + "\n" + throwable.toString(), Toast.LENGTH_SHORT).show()
                    //                        throw new RuntimeException("..."+(i++));
                } catch (e: Throwable) {

                }
            })
        }
    }

}